package com.alstudio.module.xmpp.protocol.xmpp;

import java.util.ArrayList;

import com.alstudio.core.voip.CallDetail;
import com.alstudio.module.xmpp.protocol.xmpp.data.ALXmppConnectionState;
import com.alstudio.module.xmpp.protocol.xmpp.data.VauthData;
import com.alstudio.module.xmpp.protocol.xmpp.data.economic.EconomicRecords;
import com.alstudio.module.xmpp.protocol.xmpp.data.economic.RechargeItem;
import com.alstudio.module.xmpp.protocol.xmpp.packact.ALMessage;
import com.alstudio.pojo.module.dating.DatingUser;
import com.alstudio.pojo.module.local.CallPrice;
import com.alstudio.pojo.module.local.Prop;
import com.alstudio.pojo.module.local.Props;
import com.alstudio.pojo.module.user.User;
import com.alstudio.utils.notification.SystemSettings;

/**
 * 此接口用于获取XMPP库相关的事件和数据
 * 
 * @author alonso lee
 * 
 */
public interface ALXmppEventListener {

	/**
	 * 连接丢失或者连接失败时，此回调将被调用
	 * 
	 * @param reason
	 *            连接丢失或者连接失败的原因
	 * @author alonso lee
	 */
	public void onConnectLostEvent(final String reason);

	/**
	 * 连接冲突或者连接失败时，此回调将被调用
	 * 
	 * @param reason
	 *            连接丢失原因
	 * @param conflictSid
	 *            流冲突ID
	 */
	public void onConnectLostEvent(final String reason, final String conflictSid);

	/**
	 * 登录成功后，此回调将被调用
	 * 
	 * @param jid
	 *            成功登录的jid
	 * @param pwd
	 *            jid对应的密码
	 * @author alonso lee
	 */
	public void onLoginedEvent(final String jid, final String pwd, String token);

	/**
	 * 成功登出后，此回调将被执行
	 * 
	 * @author alonso lee
	 */
	public void onLogoutEvent();

	/**
	 * 当账号验证失败时，此回调将被执行
	 * 
	 * @author alonso lee
	 */
	public void onAuthFailedEvent(final String msg);

	/**
	 * 当连接IM服务器状态发生变化时，此回调将被执行
	 * 
	 * @param newState
	 *            当前状态
	 * @param oldState
	 *            上一状态
	 * @author alonso lee
	 */
	public void onConnectStateChangedEvent(
			final ALXmppConnectionState newState,
			final ALXmppConnectionState oldState);

	/**
	 * 更新session id
	 * 
	 * @param sid
	 */
	public void onSessionIdUpdateEvent(String sid);

	/*
	 * 得到服务器下发注册的信息后通过此回调通知上层
	 * 
	 * @param userName 服务器下发的对应此IMEI的用户名。只有在注册成功或者服务器有此imei信息时才会下发账号密码
	 * 
	 * @param passWord 对应userName的密码
	 */
	public void onRegisterEvent(final String jid, final String password,
			final String user, final int code);

	/**
	 * 当服务下发第三方登录结果时,此回调将被执行
	 * 
	 * @param uid
	 * @param password
	 */
	public void onThirdPartLoginResult(String uid, String password);

	/**
	 * 当服务下发检测email是否已经注册过结果时,此回调将被执行
	 * 
	 * @param uid
	 * @param password
	 */
	public void onCheckEmailResult(boolean isRegistered);

	/**
	 * 当出现未知错误时，此回调将被执行
	 * 
	 * @param errorMessage
	 *            错误信息
	 * @author alonso lee
	 */
	public void onUnkonwErrorEvent(final String errorMessage);

	/**
	 * 当收到消息时，此回调将被执行
	 * 
	 * @param msg
	 */
	public void onReceiveMessage(final ALMessage msg);

	/**
	 * 当收到消息回执时，此回调将被执行
	 * 
	 * @param from
	 * @param id
	 */
	public void onReceiveMessageBackEvent(final String from, final String id);

	/**
	 * @param user
	 *            更改状态的电话号码
	 * @param show
	 *            具体状态。取值范围为"online"和"offline"
	 * @param timeStamp
	 *            当show为"online"时，timeStamp为null。否则，timeStamp为离线时间
	 */
	public void onPresenceStatusEvent(final String user, final String show);

	/**
	 * 当收到服务器下发S2C或者响应C2S心跳包时，此回调将被执行。
	 * 
	 * @param c2s
	 *            true,表示服务器响应C2S心跳包;false,表示服务器下发S2C心跳包
	 * @author alonso lee
	 */
	public void onGetPingPackageEvent(boolean c2s);

	/************************************************************ voip ****************************************************************/

	/**
	 * 解析拨打电话结果
	 * 
	 * @param code
	 *            0标示拨打成功，否則為失敗
	 * @param session
	 *            拨打成功后的session id null标示失败
	 */
	public void onGetMakeVoipCallResult(int code, String session);

	/**
	 * 解析接听电话结果
	 * 
	 * @param code
	 *            0标示接听成功，否則為失敗
	 * @param sessionId
	 *            接听成功后的session id null标示失败
	 * @param ip
	 *            接听成功后的对方ip null标示失败
	 * @param port
	 *            接听成功后的对方端口 -1标示失败
	 */
	public void onGetAcceptVoipCallResult(int code, String sessionId,
			ALMessage msg);

	/**
	 * 解析拒绝来电结果
	 * 
	 * @param sessionId
	 *            拒绝来电后的session id
	 */
	public void onGetRejectVoipCallResult(String sessionId);

	/**
	 * 解析挂断电话结果
	 * 
	 * @param sessionId
	 *            挂断来电后的session id
	 */
	public void onGetHandUpVoipCallResult(String sessionId);

	/**
	 * 进入爆米花结果。
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 */
	public void onGetEnterBaoMiHuaResult(int code);

	/**
	 * 退出爆米花结果
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 */
	public void onGetExitBaoMiHuaResult(int code);

	/**
	 * 进入邂逅结果
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 * @param hasMore
	 *            true表示还有更多
	 * @param users
	 *            当且仅当code等于0时，users才有数据
	 */
	public void onGetXiehouResult(int code, boolean hasMore, DatingUser users);

	/**
	 * 得到voip通话记录
	 * 
	 * @param code
	 *            0表示成功，其他表示失败
	 * @param type
	 *            请求类型 请求与陌生人的通话记录 CHECK_VOIP_RECORD_STRANGER = 0; 请求与好友的通话记录
	 *            CHECK_VOIP_RECORD_FRIENDS = 1; 请求爆米花通话记录
	 *            CHECK_VOIP_RECORD_BAOMIHUA = 2;
	 * 
	 * @param hasMore
	 *            true表示还有更多
	 * @param users
	 *            当且仅当code等于0时，users才有数据
	 */
	public void onGetVoipRecordResult(int code, int type, boolean hasMore,
			ArrayList<User> users);

	/**
	 * 设置voip价格回调
	 * 
	 * @param code
	 */
	public void onSetVoipCallPriceResult(int code);

	/**
	 * 通话价格回调
	 * 
	 * @param code
	 * @param prices
	 */
	public void onGetVoipCallPriceListResult(int code,
			ArrayList<CallPrice> prices);

	/**
	 * 通话记录详情回调
	 * 
	 * @param code
	 * @param jid
	 * @param calls
	 * @param hasMore
	 */
	public void onGetVoipCallHistoryDetailResult(int code, String jid,
			ArrayList<CallDetail> calls, boolean hasMore);

	/**
	 * 删除通话详情回调
	 * 
	 * @param code
	 * @param jid
	 */
	public void onGetDeleteVoipCallHistoryDetailResult(int code, String jid);

	/************************************************************ voip ****************************************************************/

	/**
	 * 请求发现用户结果
	 * 
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onGetDiscoveryUsersResult(final int code,
			final boolean hasMore, ArrayList<User> users);

	/**
	 * 请求发现用户结果
	 * 
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onGetSearchUsersResult(String type, int code, boolean hasMore,
			ArrayList<User> users);

	/**
	 * 当服务器响应请求热榜时，此回调将被执行
	 * 
	 * @param type
	 *            返回的表单类型。0表示魅力榜、1表示富豪榜、2表示女神帮
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onGetRankUsersResult(final int type, final int code,
			final boolean hasMore, ArrayList<User> users);

	/**
	 * 当服务器响应用户请求排行榜排名时，此回调将被执行
	 * 
	 * @param code
	 *            0标示成功，其他标示失败
	 * @param popular
	 *            女神榜排名 当且仅当code为0时有效
	 * @param rich
	 *            富豪榜排名 当且仅当code为0时有效
	 * @param glamour
	 *            魅力榜排名 当且仅当code为0时有效
	 */
	public void onGetRankingRankResult(final int code, String popular,
			String rich, String glamour, String popularValue, String richValue,
			String glamourValue);

	/**
	 * 当服务器响应请求好友列表或者粉丝列表时，此回调将被执行
	 * 
	 * @param type
	 *            返回的表单类型。0表示好友、1粉丝
	 * @param code
	 * @param hasMore
	 * @param users
	 */
	public void onGetFriendsAndFansResult(final int type, final int code,
			final boolean hasMore, ArrayList<User> users, final int count,
			final String version, final String specialFavoritesCount);

	/**
	 * 回调相互关注
	 * 
	 * @param code
	 *            0标示成功，其他标示失败
	 * @param hasMore
	 *            true标示还有更多
	 * @param users
	 *            用户列表。当且仅当code为0时有效
	 */
	public void onGetFavoritesEachOtherResult(final int code,
			final boolean hasMore, ArrayList<User> users);

	/**
	 * 当服务器想要请求删除好友或者粉丝时，此回调将被执行
	 * 
	 * @param type
	 *            删除类型，0标示好友，1标示粉丝
	 * @param count
	 *            剩余条目
	 * @param version
	 *            当前版本号
	 * @param jid
	 *            被删除jid
	 */
	public void onGetDeletFriendOrFansResult(final int type, final int count,
			final String version, final String jid, final int code);

	/**
	 * 当服务器响应添加普通关注或者特别关注时，此回调将被执行
	 * 
	 * @param type
	 *            0表示普通关注 1表示特别关注
	 * @param code
	 *            0表示成功，其他别是失败
	 * @param version
	 *            关注过后的版本号
	 * @param user
	 *            已关注用户
	 */
	public void onGetAddNormalOrSpecialFavoritesResult(final int type,
			final int code, String version, User user);

	/**
	 * 当服务器响应设定用户备注名时，此回调将被执行
	 * 
	 * @param code
	 *            0表示成功，其他别是失败
	 * @param jid
	 *            成功设置备注名的用户jid
	 */
	public void onSetUserNoteNameResult(final int code, String jid);

	/**
	 * 當服務器響應獲取用戶資料時,此囘調將被執行
	 * 
	 * @param code
	 *            0表示成功，其他别是失败
	 * @param u
	 *            當且僅當code為0時有效
	 */
	public void onGetUserProfileResult(final int code, User u);

	/**
	 * 当服务器响应修改用户资料时，此回调将被执行
	 * 
	 * @param code
	 *            0表示成功，其他别是失败
	 */
	public void onGetModifyUserProfileResult(final int code);

	/**
	 * 得到黑名单列表
	 * 
	 * @param code
	 * @param users
	 */
	public void onGetBlackListResult(final int code, ArrayList<User> users);

	/******************************** 賬號設置 *************************************************/
	/**
	 * 当服务器响应更改密码请求时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功；404表示密码长度不符合要求；403表示还没有绑定自定义账号；402表示原密码不对
	 * @author alonso lee
	 */
	public void onChangePasswordEvent(int code, String newPwd);

	/**
	 * 申请V认证
	 * 
	 * @param
	 */
	public void onVAuthetication(final int code, VauthData data);

	/**
	 * 获取加V认证状态
	 * 
	 * @param status
	 * @param smallurl
	 * @param url
	 * @param vavatar
	 * @param index
	 */
	public void onVAutheticationState(final int code, VauthData data);

	/**
	 * 提交语音介绍结果
	 * 
	 * @param code
	 */
	public void onCommitVoiceIntroEvent(final int code);

	/**
	 * 获取服务器上的用户配置
	 * 
	 * @param code
	 * @param settings
	 */
	public void onGetUserOptEvent(final int code, SystemSettings settings);

	/**
	 * 绑定邮箱结果
	 * 
	 * @param code
	 */
	public void onGetBindEmailResultEvent(final int code);

	/**
	 * 绑定邮箱成功回调
	 * 
	 * @param code
	 */
	public void onGetBindEmailSuccessEvent(final int code);
	
	/**
	 * 再次绑定邮箱回调
	 * 
	 * @param code
	 */
	public void onGetBindEmailSendAgainEvent(final int code);

	/*********************************** 經濟系統 **********************************************/

	/**
	 * 当服务器响应清除账单或者积分清单时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param type
	 *            0表示清空账单，1表示清空积分
	 */
	public void onGetClearMoneyOrPointHistoryResult(int code, int type);

	/**
	 * 当服务器响应获取用户积分时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param points
	 *            用户积分
	 */
	public void onGetUserPointsResult(int code, String points);

	/**
	 * 当服务器想要获取账单或者积分清单时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param type
	 *            0标示账单，1标示积分
	 * @param records
	 *            当且仅当code为0时数据才有效
	 */
	public void onGetEconomicRecordsResult(int code, int type, boolean hasMore,
			ArrayList<EconomicRecords> economicRecords);

	/**
	 * 当服务器响应获取充值套餐时，此回调将被执行
	 * 
	 * @param code
	 *            0 表示更改成功，其他为失败
	 * @param type
	 *            充值类型，当前支持"rmb"、"dollar"
	 * @param rechargeItems
	 *            当且仅当code为0时，数据有效
	 */
	public void onGetRechagePriceResult(int code, String type,
			ArrayList<RechargeItem> rechargeItems);

	/************************************** 道具系统 *****************************************************/

	/**
	 * 解析服务器下发的道具商城列表回执
	 * 
	 * @param propslist
	 */
	public void onGetPropsMallListResult(final int code,
			ArrayList<Props> propslist);

	/**
	 * 解析服务器下发的道具购买信息列表回执
	 * 
	 * @param propslist
	 */
	public void onGetCurrentBuyPropsInfoResult(final int code,
			ArrayList<Prop> propslist, Prop curPorp, int propBuyCount);

	/**
	 * 解析服务器下发的我的道具列表
	 * 
	 * @param proplist
	 * @param propSubscribecount
	 */
	public void onGetMyPropsResult(final int code, ArrayList<Prop> proplist,
			int propSubscribecount);

	/**
	 * 解析服务器下发的购买详细列表
	 * 
	 * @param proplist
	 */
	public void onGetPropsPurchaseInfoListResult(final int code,
			ArrayList<Prop> proplist);

	/**
	 * 解析服务器下发的删除购买详细回执
	 * 
	 * @param bool
	 */
	public void onDeletePropsPurchaseInfoListResult(final int code, boolean bool);

	/**
	 * 解析服务器下发的道具生效回执
	 * 
	 * @param bool
	 */
	public void onGetEffectivePropResult(final int code, boolean bool);
}
